﻿using System;
using System.Configuration;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CubaLibreBar.Model.Core.Entities;
using System.Data.SqlClient;
using System.Data.SqlServerCe;
using CubaLibreBar.Model.Dados;
using System.Data;
using CubaLibreBar.Model.Entidades;

namespace CubaLibreBar.Model.Dados
{
    public static class RelatoriosDAO
    {
        /// <summary>
        /// Gera os dados do relatório de Caixa
        /// </summary>
        /// <returns></returns>
        public static void GerarRelatorioFluxoCaixa(DateTime inicio, DateTime fim)
        {
            List<FluxoCaixaDto> caixa = new List<FluxoCaixaDto>();

            try
            {
                using (SqlCeConnection connection = ConnectionFactory.GetConnection())
                {
                    connection.Open();

                    using (SqlCeCommand cmd = connection.CreateCommand())
                    {
                        string query = @"SELECT V.IdVenda, P.IdProduto, V.DataVenda, P.NomeProduto, P.PrecoCompra, P.PrecoVenda, VP.QuantidadeProduto, (P.PrecoCompra * VP.QuantidadeProduto) as ValorCusto,((P.PrecoVenda - P.PrecoCompra) * VP.QuantidadeProduto) as ValorLucro
                                            FROM tbVendasProdutos as VP 
	                                        INNER JOIN tbProdutos P ON P.IdProduto = VP.IdProduto
	                                        INNER JOIN tbVendas V ON V.IdVenda = VP.IdVenda";

                        query = query + @"
                                            WHERE DataVenda >= @DataInicio AND DataVenda <= @DataFim";
                        cmd.Parameters.Add(new SqlCeParameter("@DataInicio", inicio));
                        cmd.Parameters.Add(new SqlCeParameter("@DataFim", fim));

                        cmd.CommandText = query;
                        SqlCeDataReader reader = cmd.ExecuteReader();
                        while (reader.Read())
                        {
                            FluxoCaixaDto fluxo = new FluxoCaixaDto();
                            fluxo.IdProduto = Convert.ToInt32(reader["IdProduto"]);
                            fluxo.IdVenda = Convert.ToInt32(reader["IdVenda"]);
                            fluxo.DataVenda = Convert.ToDateTime(reader["DataVenda"]);
                            fluxo.NomeProduto = Convert.ToString(reader["NomeProduto"]);
                            fluxo.PrecoCompra = Convert.ToDecimal(reader["PrecoCompra"]);
                            fluxo.PrecoVenda = Convert.ToDecimal(reader["PrecoVenda"]);
                            fluxo.QuantidadeProduto = Convert.ToInt32(reader["QuantidadeProduto"]);
                            fluxo.TotalCusto = Convert.ToDecimal(reader["ValorCusto"]);
                            fluxo.TotalLucro = Convert.ToDecimal(reader["ValorLucro"]);

                            caixa.Add(fluxo);
                        }
                        
                        reader.Close();

                        // Limpa a tabela do relatório
                        cmd.CommandText = @"DELETE tbFluxoCaixa";
                        cmd.ExecuteNonQuery();

                        // Insere os novos dados
                        cmd.CommandText = @"INSERT INTO tbFluxoCaixa VALUES (@DataVenda, @NomeProduto, @PrecoCompra, @PrecoVenda, @QuantidadeProduto, @TotalCusto, @TotalLucro, @IdVenda, @IdProduto)";

                        foreach (var fluxo in caixa)
                        {
                            cmd.Parameters.Add(new SqlCeParameter("@IdProduto", fluxo.IdProduto));
                            cmd.Parameters.Add(new SqlCeParameter("@IdVenda", fluxo.IdVenda));
                            cmd.Parameters.Add(new SqlCeParameter("@DataVenda", fluxo.DataVenda));
                            cmd.Parameters.Add(new SqlCeParameter("@NomeProduto", fluxo.NomeProduto));
                            cmd.Parameters.Add(new SqlCeParameter("@PrecoCompra", fluxo.PrecoCompra));
                            cmd.Parameters.Add(new SqlCeParameter("@PrecoVenda", fluxo.PrecoVenda));
                            cmd.Parameters.Add(new SqlCeParameter("@QuantidadeProduto", fluxo.QuantidadeProduto));
                            cmd.Parameters.Add(new SqlCeParameter("@TotalCusto", fluxo.TotalCusto));
                            cmd.Parameters.Add(new SqlCeParameter("@TotalLucro", fluxo.TotalLucro));

                            cmd.ExecuteNonQuery();

                            cmd.Parameters.Clear();
                        }
                    }

                    connection.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}
